#include <iostream>
#include <cstring>
#include <unistd.h>
#include <sys/ipc.h> //Inter-Process Communication
#include <sys/shm.h>
#include "comm.hpp"

//client（客户端）是写端

int main()
{
    key_t key = GetKey();
    int shmid = GetShm(key);
    char *s = (char*)shmat(shmid, nullptr, 0);
    std::cout << "attach shm done" << std::endl;
    int fd = open(filename.c_str(), O_WRONLY);//服务端打开管道，为了实现同步机制

    // sleep(10);
    // TODO,配合server.cc的TODO内容
    // 共享内存的通信方式，不会提供同步机制,也就是你跑你的，我跑我的，不会互相等待，但是可能会出问题，比如写入“1+1=2”
    // 还没写完的时候却只读取了“1+”，这就是多执行流并发访问公共资源时的数据不一致问题，所以需要一些保护机制,或者利用管道实现同步
    // 共享内存是直接裸露给所有的使用者的，一定要注意共享内存的使用安全问题
    // 
    char c = 'a';
    for(; c <= 'z'; c++)
    {
        s[c-'a'] = c;
        std::cout << "write : " << c << " done" << std::endl;
        sleep(1);


        // 通知对方
        // 刚开始的时候管道和共享内存都还不存在，然后开始运行server，这时候就创建了共享内存（server挂接到共享内存里了）和管道
        // 打印“开始映射到进程地址空间”就不往后走了（因为当前只有一个进程打开了这个文件，阻塞等待client进程运行）
        // client运行起来之后就写入，期望的效果是每隔6秒写一个字符，并且server进程应该看到一个读一个
        // 而不是在这6秒期间读取了六次同样的字符。所以建立了管道，每隔6秒才通知server读取刚写入的字符，这样才算是提供了同步机制
        int code = 1;//这个数值似乎不重要？
        write(fd, &code, sizeof(4));
    }

    shmdt(s);
    std::cout << "detach shm done" << std::endl;
    close(fd);
    return 0;
}
